package thread;

/**
 * 线程提供了一个方法,可以协调线程之间的同步运行
 * 同步运行:线程之间的执行存在先后顺序
 * 异步运行:线程之间的执行没有顺序,各干各的
 * 多线程本身就是异步运行的,但是某些业务场景需要线程在特定节点玩成同步运行
 *
 * join方法允许一个线程在该方法所属的县城上等待(阻塞),直到其运行完毕后方
 * 可接触阻塞执行后续的代码
 *
 * @author Luka
 * @date 2021/06/04 10:31
 **/
public class JoinDemo {
    public static boolean isFinish;

    public static void main(String[] args) {
        /*
            java语法要求:
            一个方法的局部内部类中若引用了这个方法的其他局部变量时,该变量必须
            时final的 FDK8之后final可以不显示的生命出来,但是该要求仍然独立
         */
//        boolean isFinish = false;
        Thread download = new Thread(){
            @Override
            public void run() {
                for (int i = 0; i <=100 ; i++) {
                    System.out.println("down"+i+"%");
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("down:图片下载完毕!");
                isFinish = true;
            }
        };

        Thread show = new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("show:显示文字完毕!");
                System.out.println("show:开始显示图片");
//                先等待download执行完毕(图片下载完毕)
                try {
                    System.out.println("show:等待download下载");
                    download.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if (!isFinish){
                    throw new RuntimeException("图片显示异常");

                }
                System.out.println("show:图片显示完毕");
            }
        };
        download.start();
        show.start();
    }
}